// leetcode 第914题 914. 卡牌分组
// https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/
// 老师讲的有点问题，那样是不会通过的，我用python测试了。比如输入[1,1,1,1,2,2,2,2,2,2]
// 其实这道题求的是：分组之后，各组数量的最大公约数，且这个最大公约数不能是1

export default (arr) => {
  // 传入的数组小于2，直接返回false
  if (arr.length < 2) {
    return false
  }
  // 对这副牌进行排序，升序、降序都行
  arr.sort((a, b) => a - b)
  // console.log('arr', arr)
  // let min = Number.MAX_SAFE_INTEGER
  // 存储所有分好组的数组
  let dst = []
  // let result = true
  for (let i = 0, len = arr.length, tmp = []; i < len; i++) {
    tmp.push(arr[i])
    for (let j = i + 1; j < len; j++) {
      if (arr[i] === arr[j]) {
        tmp.push(arr[j])
        // 保证最后一次循环的时候把tmp数据保存到dst里
        if (j + 1 === len) {
          dst.push([].concat(tmp))
          // 清空数组
          tmp.length = 0
          i = j
          break
        }
      } else {
        // if (min > tmp.length) {
        //   min = tmp.length
        // }
        // 数组是引用类型，需要这样做，以在内存中区分开来
        dst.push([].concat(tmp))
        // 清空数组
        tmp.length = 0
        i = j - 1
        break
      }
    }
  }

  // console.log('dst', dst)
  // 分好组之后，获得各组的数量
  let nums = dst.map(item => {
    return item.length
  })

  // 用来求最大公约数
  function maxCommonDivisor (nums) {
    // 设置最大公约数的默认值为1
    let commonDivisor = 1
    // 为了通用性，可以拷贝到其他地方使用,对nums做绝对值处理
    nums = nums.map(Math.abs)
    // 数组的最大公约数不会比最小值还大
    let minVal = Math.min(...nums)
    // 一个数的话，最大公约数是本身
    if (nums.length === 1) {
      commonDivisor = nums[0]
    } else {
      for (let i = 1; i <= minVal; i++) {
        let modSum = nums.map(val => {
          return val % i
        }).reduce((preVal, curVal) => {
          return preVal + curVal
        }, 0)

        if (modSum === 0) {
          commonDivisor = i
        }
      }
    }
    return commonDivisor
  }

  // 求所有分组，成员个数的最大公约数，如果不等于1，返回true,否则返回false
  let commonDivisor = maxCommonDivisor(nums)
  if (commonDivisor > 1) {
    return true
  } else {
    return false
  }
}
